package com.galengao.rabbitmq.helloworld;


import com.galengao.rabbitmq.util.RabbitmqUtils;
import com.rabbitmq.client.*;
import lombok.extern.slf4j.Slf4j;
import java.nio.charset.StandardCharsets;

import static com.galengao.rabbitmq.util.RabbitmqUtils.EXCHANGE_NAME;

/**
 * 消息生产者代码示例
 */
@Slf4j
public class MessageProducer {

    public static void main(String[] args) {
        try (   // 创建链接
                Connection connection = RabbitmqUtils.getConnection(RabbitmqUtils.connectionFactory());
                // 获取信道
                Channel channel = RabbitmqUtils.getChannel(connection);
        ) {
            // 第一个参数：声明交换机的名称，第二个参数：声明交换机的类型，第三个参数：是否需要持久化（即使rabbitmq服务重启交换机依然存在）
            // 第四个参数：是否自动删除交换机（如果声明为true则交换机如果没有被使用将会被删除），第五个参数：声明交换机的配置参数
            channel.exchangeDeclare(RabbitmqUtils.EXCHANGE_NAME, BuiltinExchangeType.DIRECT,true,false,null);

            // 第一个参数：声明队列名称，第二个参数：是否需要持久化（即使rabbitmq服务重启队列依然存在）
            // 第三个参数：是否声明一个独享的队列，如果为true则只能被一个消费者进行消费
            // 第四个参数：是否自动删除队列（如果为true，当队列未被使用时候会被自动删除），第五个参数：声明队列的配置参数
            channel.queueDeclare(RabbitmqUtils.QUEUE_NAME,true,false,false,null);
            // 通过路由key将队列与交换机进行绑定
            channel.queueBind(RabbitmqUtils.QUEUE_NAME,RabbitmqUtils.EXCHANGE_NAME,RabbitmqUtils.ROUTE_KEY);
            // 声明一个文本内容
            String message ="hello it's message form MessageProducer";
            // 发送消息
            channel.basicPublish(RabbitmqUtils.EXCHANGE_NAME,RabbitmqUtils.ROUTE_KEY, MessageProperties.TEXT_PLAIN,message.getBytes(StandardCharsets.UTF_8));
            log.info("send message success:{}",message);
        } catch (Exception e) {
            log.error("send message fail",e);
        }
    }
}
